
package com.zjxd.business.web.utils;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

/**
 * @author QIk
 */
public class CoreUtil {

	private static final SimpleDateFormat	simpleDateFormat	= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	/**
	 * 获取验证码随机数
	 * 
	 * @return
	 */
	public static String getSmsCode() {

		Random random = new Random();
		StringBuffer sms = new StringBuffer();
		for (int i = 0; i < 6; i++) {
			sms.append(random.nextInt(9));
		}
		return sms.toString();
	}

	/**
	 * 获取随机数
	 * 
	 * @param length
	 *            长度
	 * @return
	 */
	public static String getRandom(int length) {

		Random random = new Random();
		StringBuffer sms = new StringBuffer();
		for (int i = 0; i < length; i++) {
			sms.append(random.nextInt(9));
		}
		return sms.toString();
	}

	/**
	 * 获取随机字符串
	 * 
	 * @param length
	 *            长度
	 * @return
	 */
	public static String getRandomString(int length) { // length表示生成字符串的长度

		String base = "abcdefghijklmnopqrstuvwxyz0123456789";
		Random random = new Random();
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < length; i++) {
			int number = random.nextInt(base.length());
			sb.append(base.charAt(number));
		}
		return sb.toString();
	}

	/**
	 * 字符串为 null 或者内部字符全部为 ' ' '\t' '\n' '\r' 这四类字符时返回 true
	 */
	public static boolean isBlank(String str) {

		if (str == null) { return true; }
		int len = str.length();
		if (len == 0) { return true; }
		for (int i = 0; i < len; i++) {
			switch (str.charAt(i)) {
				case ' ' :
				case '\t' :
				case '\n' :
				case '\r' :
					// case '\b':
					// case '\f':
					break;
				default :
					return false;
			}
		}
		return true;
	}

	/**
	 * 验证长度 达到长度返回false
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isLength(String str) {

		if (str == null) { return true; }
		int len = str.length();
		if (len == 0) { return true; }
		if (len < 6) { return true; }
		return false;
	}

	// 判断是否是是100的倍数
	public static boolean isMultiple(int dollar) {

		if (dollar % 100 == 0) { return true; }
		return false;
	}

	// 随机生产字符串
	public static String getUploadFilePathDontIncUpload() {

		return UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
	}

	/**
	 * 计算间隔时间 （分）
	 * 
	 * @param startTime
	 *            开始时间
	 * @param endTime
	 *            结束时间
	 * @return
	 */
	public static Integer getIntervaltime(Long startTime, Date endTime) {

		return (int) ((endTime.getTime() - startTime) / 1000 / 60);
	}

	/**
	 * 计算间隔时间 （分）
	 * 
	 * @param startTime
	 *            开始时间
	 * @param endTime
	 *            结束时间
	 * @return
	 */
	public static Integer getIntervaltime(Date startTime, Date endTime) {

		if (null == startTime) { return 0; }
		if (null == endTime) { return 0; }
		return (int) ((endTime.getTime() - startTime.getTime()) / 1000 / 60) + 1;
	}

	/**
	 * 计算间隔时间 （秒）
	 * 
	 * @param startTime
	 *            开始时间
	 * @param endTime
	 *            结束时间
	 * @return
	 */
	public static Integer getSigninintervaltime(long startTime, long endTime) {

		return (int) ((endTime - startTime) / 1000);
	}

	/**
	 * 时间格式转换：将时间撮转成（yyyy-MM-dd hh:mm:ss） *1000
	 * 
	 * @param time
	 * @return
	 */
	public static Date getTimeFormat1000L(long time) {

		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			String date = sdf.format(time * 1000L);
			return sdf.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return new Date();
	}

	/**
	 * 时间格式转换：将时间撮转成（yyyy-MM-dd hh:mm:ss）
	 * 
	 * @param time
	 * @return
	 */
	public static Date getTimeFormat(Long time) {

		try {
			String date = simpleDateFormat.format(time);
			return simpleDateFormat.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 日期转换 0000-00-00 00:00:00
	 * 
	 * @param time
	 * @return
	 */
	public static String getTimeFormat(Date time) {

		if (null == time) { return "0000-00-00 00:00:00"; }
		return simpleDateFormat.format(time);
	}

	/**
	 * 时间转换
	 * 
	 * @param time
	 * @return yyyy-MM-dd HH:mm
	 */
	public static String getTimeFormatF(Date time) {

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		if (null == time) { return "0000-00-00 00:00"; }
		return sdf.format(time);
	}

	/**
	 * 时间转换
	 * 
	 * @param time
	 * @return HH:mm:dd
	 */
	public static String getTimeFormatHMD(Date time) {

		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:dd");
		if (null == time) { return "00:00:00"; }
		return sdf.format(time);
	}

	/**
	 * 获取本地ip
	 * 
	 * @return
	 */
	public static String getHost() {

		try {
			return InetAddress.getLocalHost().getHostAddress();
		} catch (UnknownHostException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 获取当前系统时间：秒
	 * 
	 * @return 返回当前时间戳
	 */
	public static Long getCurrentSecond() {

		return System.currentTimeMillis() / 1000;
	}

	/**
	 * 获取客户端IP地址
	 */
	public static String getIpAddr(HttpServletRequest request) {

		String ip = request.getHeader("X-Real-IP");
		if (ip == null) {
			ip = request.getHeader("X-Forwarded-For");
		}
		if (ip == null) {
			ip = request.getRemoteAddr();
		}
		if (isBlank(ip) && "unknown".equalsIgnoreCase(ip) == false) {
			int index = ip.indexOf(",");
			if (index != -1) { return ip.substring(0, index); }
		}
		if (ip.equals("127.0.0.1") || ip.equals("0:0:0:0:0:0:0:1")) {
			InetAddress inet = null;
			try {
				inet = InetAddress.getLocalHost();
			} catch (UnknownHostException e) {
				e.printStackTrace();
			}
			ip = inet.getHostAddress();
		}
		// 对于通过多个代理的情况，第一个IP为客户端真实IP,多个IP按照','分割
		if (ip != null && ip.length() > 15) { // "***.***.***.***".length() = 15
			if (ip.indexOf(",") > 0) {
				ip = ip.substring(0, ip.indexOf(","));
			}
		}
		return ip;
	}

}
